package net.gdface.sdk.fse;

import java.nio.LongBuffer;
import java.util.Comparator;

import net.gdface.utils.BufferUtils;
import net.gdface.utils.FaceUtilits;

/**
 * 特征码内存对象<br>
 * 特征码内存JNI内存对象的Java层映射,
 * 该类实现了{@link Comparable}接口，可以根据相似度结果字段({@link CodeBean#similarity})排序
 * @author guyadong
 *
 */
public  class CodeBean implements Comparable<CodeBean>{	
	/**
	 * 特征码ID,
	 * 特征码的MD5校验值(使用MD5保证特征码ID的唯一性)
	 */
	public	byte[] id=null;
	/**
	 * 人脸特征码(人脸模板)数据，数据长度与实际应用的算法相关
	 */
	public byte[] code=null;
	/**
	 * 当前特征码所属的图像的MD5校验值(图像ID),可为{@code null},
	 * 应用层也可将此字段根据业务需要解释为其他含义
	 */
	public String imgMD5=null;
	/**
	 * 相似度比较结果，该字段只在特征码搜索方法返回值中有效。用于当前存储人脸特征方法调用搜索返回结果.
	 * 代表当前特征码与输入搜索人脸特征的相似度比较值。
	 */
	public double similarity=0;
	
	@Override
	public String toString() {
		return toString(false);
	}
	public String toString(boolean full) {
		String out=String.format("id=[%s],imgMD5=[%s],similarity=%f", FaceUtilits.toHex(id),imgMD5,similarity);
		if(full){
			out+=String.format("\ncode:\n%s\n", null==code?"null":FaceUtilits.toHex(code));
		}
		return out;
	}
	@Override
	public int compareTo(CodeBean o) {
		double sub = similarity - o.similarity;
		return sub > 0 ? 1 : (sub < 0 ? -1 : 0);
	}

	/**
	 * 将{@link #imgMD5}转为应用id(Long),如果{@link #imgMD5}为{@code null}则返回{@code null}
	 * @return
	 */
	public Long appLongId(){
		return asAppID(imgMD5);
	}
	/**
	 * 将{@link #imgMD5}转为应用id(Integer),如果{@link #imgMD5}为{@code null}则返回{@code null}
	 * @return
	 */
	public Integer appIntId(){
		Long l = asAppID(imgMD5);
		return l == null ? null : l.intValue();
	}
	/**
	 * 用于相似度排序的{@link Comparator}实例
	 */
	public static final Comparator<CodeBean> COMPARATOR = new Comparator<CodeBean>() {
		@Override
		public int compare(CodeBean o1, CodeBean o2) {
			return o1.compareTo(o2);
		}
	};
	/**
	 * 将Long类型整数转为32位的字符串,用于 {@link #imgMD5}字段
	 * @param appid
	 * @return appid为{@code null}则返回{@code null}
	 */
	static String asImgMD5(long appid){
		LongBuffer buffer = LongBuffer.allocate(2).put(0).put(appid);
		return FaceUtilits.toHex(BufferUtils.asByteArray(buffer.array()));
	}
	/**
	 * 从{@link #imgMD5}字段返回Long类型整数,
	 * @param imgMD5 HEX格式(32字节长)的MD5
	 * @return imgMD5为{@code null}则返回{@code null}
	 */
	static Long asAppID(String imgMD5){
		if(imgMD5 != null && imgMD5.getBytes().length == 32){			
			return BufferUtils.asLongArray(FaceUtilits.hex2Bytes(imgMD5))[1];
		}
		return null;
	}
}